package br.com.future.bo;

import java.text.ParseException;
import java.util.Calendar;
import java.util.List;

import org.joda.time.Days;
import org.joda.time.LocalDate;

import br.com.future.dao.interfaces.BloqueioDesbloqueioDAOI;
import br.com.future.dao.interfaces.DAOFactory;
import br.com.future.dao.interfaces.TituloDAOI;
import br.com.future.mail.EnviaEmail;
import br.com.future.model.Titulo;

/**
 * Classe TituloBO.
 * 
 * @author Future Technology Brazil
 * @version 1.1 03/10/2012
 */
public class TituloBO {
	private static int numOfDays;
	/**
	 * Consultar.
	 * 
	 * @return the list
	 */
	
	public static List<Titulo> consultar() {
		TituloDAOI tituloDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
				.getTituloDAO();
		return tituloDAO.consultar();
	}

	public static void controlarAtraso() throws ParseException {
		List<Titulo> titulos = consultar();
		for (Titulo titulo : titulos) {
			if (ProcessoBO.verificaProcesso(titulo.getProcesso().getNumeroProcesso()) == false) {
				System.out.println("Processo: " + titulo.getProcesso().getNumeroProcesso() +" Ja Esta Bloqueado ou não está atrasado");
			} else {
			if (verificarDatas(Calendar.getInstance(),titulo.getDataVencimento())) {
				ProcessoBO.bloquearProcesso(titulo.getProcesso());
				double valorComJurosDiario = titulo.getValorDocumento() + (1.00 * numOfDays) ;
				titulo.setValorDocumento(valorComJurosDiario);
				switch (titulo.getProcesso().getTipoCobranca().getCodigoCobranca()) {
					case 1:
						double valorComJurosMensal = calculaJurosMensal(titulo.getValorDocumento());
						titulo.setValorDocumento(valorComJurosMensal);
						alterarTitulo(titulo);
						break;
					case 2:
						double valorComJurosTrimestral = calculaJurosTrimestral(titulo.getValorDocumento());
						titulo.setValorDocumento(valorComJurosTrimestral);
						alterarTitulo(titulo);
						break;
					case 3:
						double valorComJurosSemestral = calculaJurosSemestral(titulo.getValorDocumento());
						titulo.setValorDocumento(valorComJurosSemestral);
						alterarTitulo(titulo);
						break;
					}
					enviarEmail(titulo);
				}
			}
		}
	}
	public static void limparTabela(){
		BloqueioDesbloqueioDAOI bloqueio = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getBloqueioDesbloqueioDAO();
		bloqueio.limparProcessos();
	}
	private static boolean verificarDatas(Calendar instance,Calendar dataVencimento) {
		LocalDate dataHoje = new LocalDate(instance);
		LocalDate dataTitulo = new LocalDate(dataVencimento);
		Days diasAtrasado = Days.daysBetween(dataTitulo, dataHoje);
		numOfDays = diasAtrasado.getDays();
		if (numOfDays >= 60) {
			return true;
		}else{
			return false;
		}
	}

	private static void alterarTitulo(Titulo titulo){
		System.out.println("Verificar Com o Renan se a Query ta certa");
		/*TituloDAOI tituloDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE).getTituloDAO();
		tituloDAO.alterarTitulo(titulo);*/
	}
	private static void enviarEmail(Titulo titulo) {
		EnviaEmail.enviar(titulo);
	}
	private static double calculaJurosMensal(double valor){
		double valorComJuros = valor + valor * 0.10;
		return valorComJuros;
	}
	private static double calculaJurosTrimestral(double valor){
		double valorComJuros = valor + valor * 0.30;
		return valorComJuros;
	}
	private static double calculaJurosSemestral(double valor){
		double valorComJuros = valor + valor * 0.60;
		return valorComJuros;
	}
	public static Titulo consultarPorID(int id) {
		TituloDAOI tituloDAO = DAOFactory.getDAOFactory(DAOFactory.ORACLE)
				.getTituloDAO();
		return tituloDAO.consultar(id);
	}
	
}
